<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <link rel="Stylesheet" type="text/css" href="default.css" />
  <meta http-equiv="Content-Type" content=
  "text/html; charset=utf-8" />

  <title>Внешние адреса</title>
</head>

<body>
  <h1>Внешние адреса</h1>

  При защите кода место, освободившееся в
      процессе компиляции, VMProtect использует для своих нужд, в
      том числе для хранения различных данных
      (завиртуализированного, промутированного кода, исполнителей
      ВМ и т.п.). В связи с этим могут возникать различные
      ситуации, когда "внутрь" защищенного кода может происходить
      переход из других частей программы (адреса, на которые может
      происходить переход, называются внешними). Подобные ситуации
      могут возникать при использовании маркеров кода, когда
      происходит переход из незащищенного участка программы внутрь
      маркера:
      <pre class="code">VMProtectBegin(nil);
for  I:=0 to 10 do
begin
  Inc(J);
  VMProtectEnd;
end;
</pre>

      <p>В виде ассемблерных команд данный цикл выглядит следующим
      образом:</p>
      <pre class="code">----------------- начало маркера ----------------
0044D12C        mov eax, 0000000B
0044D131        inc ebx 
----------------- конец маркера -----------------
0044D132        dec eax 
0044D133        jnz 0044D131
</pre>

      <p>Очевидно, что после виртуализации команд с адресами
      0044D12C и 0044D131 при выполнении незавиртуализированной
      команды условного перехода по адресу 0044D133 возникнет
      ошибка (т.к. по адресу 0044D131 вместо оригинального кода
      будут записаны различные данные или просто мусор). Для
      рассматриваемого примера адрес 0044D131 будет являться
      внешним.</p>

      <p>При включении опции "Режим отладки" на место оригинального
      кода будет записана команда INT 03, являющаяся обычной точкой
      останова и служебной командой при работе под отладчиком. При
      запуске защищенной программы из-под отладчика в случае
      передачи управления по адресу 0044D131 произойдет вызов точки
      останова, а при открытии окна отладчика можно будет увидеть,
      по какому адресу произошел данный переход.</p>

      <p>При обнаружении подобных переходов рекомендуется проверить
      правильность расстановки маркеров кода. Если защищаемый код
      не помечен маркерами или невозможно изменить логику
      приложения так, чтобы внутрь защищаемого кода не было
      перехода из других частей программы, то, используя
      графическую версию приложения, данные адреса <a href=
      "project_functions.htm#ExtAddress">следует пометить как
      внешние</a>.</p>

  <br />
  <br />
  <br />
  <br />
  <hr noshade="noshade" size="1" />

  <div align="center">
    © 2006-2015 Copyright VMProtect Software
  </div>
</body>
</html>
